<%--
  Created by IntelliJ IDEA.
  User: 98114
  Date: 2022/2/14
  Time: 11:04
  To change this template use File | Settings | File Templates.
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" session="false" %>
<html>
<head>
    <title>Index</title>
    <link rel="stylesheet" href="<c:url value="/resources/style.css" />">
</head>
<body>
    <h1>Hello World!</h1>
    <!-- 对于渲染文本来说，使用 Spring 的 message 标签是很好的方案，文本能够位于一个或多个属性文件中 -->
    <%-- <s:message> 将会根据 key 为 spittr.welcome 的信息源来渲染文本。 --%>
    <h1><s:message code="spittr.welcome"></s:message></h1><br/>

    <%-- <s:url> 是一个很小的标签。它主要的任务就是创建 URL，然后将其赋值给一个变量或者渲染到响应中。它是 JSTL 中 <c:url> 标签的替代者 --%>
    <%-- 按照其最简单的形式，<s:url> 会接受一个相对于 Servlet 上下文的 URL，并在渲染的时候，预先添加上 Servlet 上下文路径。此应用的 Servlet 上下文是 jsp（部署到 tomcat 时自己设定的），
     那么下面的 href 就会渲染为 /jsp/spitter/register，这样我们在创建 URL 的时候就不必再担心 Servlet 上下文路径是什么了，<s:url> 将会负责这件事 --%>
    <a href="<s:url value="/spitter/register" />">Register</a>

    <%-- 我们还可以使用 <s:url> 创建 URL，并将其赋值给一个变量供模板在稍后使用 --%>
    <s:url value="/spitter/register" var="registerUrl"></s:url>

    <%-- 默认情况下，URL 是在页面作用域内创建的。但是通过设置 scope 属性，我们可以让 <s:url> 在应用作用域内、会话作用域内或请求作用域内创建 URL --%>
    <s:url value="/spitter/register" var="registerUrl1" scope="request"></s:url>
    <a href="${registerUrl}">Register1</a><br/>

    <%-- 如果希望在 URL 上添加参数的话，那么你可以使用 <s:param> 标签。 --%>
    <s:url value="/spittles" var="spittlesUrl">
        <s:param name="max" value="60"></s:param>
        <s:param name="count" value="20"></s:param>
    </s:url>

    <%-- <s:url> 能够实现创建带有路径（path）参数的 URL，但是 JSTL 的 <c:url> 无法实现 --%>
    <%-- 当 value 属性中的占位符匹配 <s:param> 中所指定的参数时，这个参数将会插入到占位符的位置中。如果 <s:param> 参数无法匹配 value 中的任何占位符，
     那么这个参数将会作为查询参数 --%>
    <s:url value="/spitter/{username}" var="spitterUrl">
        <s:param name="username" value="jbauer"></s:param>
    </s:url>

    <%-- <s:url> 标签还可以解决 URL 的转义需求。例如，如果你希望将渲染得到的 URL 内容展现在 Web 页面上（而不是作为超链接），那么你应该要求 <s:url>
    进行 HTML 转义，这需要将 htmlEscape 属性设置为 true --%>
    <!-- 如果页面指令那儿不设置 session="false"，这儿的 url 部分和查询参数部分之间就会显示一个 jsessionid，例如 /jsp/spittles;jsessionid=967A5F487CAF22ED89B803A3D6B35F14?max=60&count=20 -->
    <s:url value="/spittles" htmlEscape="true">
        <s:param name="max" value="60"></s:param>
        <s:param name="count" value="20"></s:param>
    </s:url><br/>

    <%-- <s:escapeBody> 标签是一个通用的转义标签。它会渲染标签体中内嵌的内容，并且在必要的时候进行转义 --%>
    <%-- 下面是在页面上展现一个 HTML 代码片段。为了正确显示，我们需要将 “<” 和 “>” 字符替换为 “&lt;” 和 “&gt;”，
    否则的话，浏览器将会像解析页面上其他 HTML 那样解析这段 HTML 内容 --%>
    <%-- <s:escapeBody> 只完成一件事，并且完成得非常好。与 <s:url> 不同，它只会渲染内容，并不能将内容设置为变量。因为感觉没必要，都是用户不友好的内容，没必要放到变量中使用 --%>
    <s:escapeBody htmlEscape="true">
        <h1>Hello</h1>
    </s:escapeBody>

    <!-- 如果你希望在 JavaScript 代码中使用 URL 的话，那么应该将 javaScriptEscape 属性设置为 true -->
    <s:url value="/spittles" var="spittlesJSUrl" javaScriptEscape="true">
        <s:param name="max" value="60"></s:param>
        <s:param name="count" value="20"></s:param>
    </s:url>
    <script>
        var spittlesUrl = "${spittlesJSUrl}";
    </script>
</body>
</html>
